/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package raccoon.suvisa.logica.servicios.manejador.entidades.su.beans;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.logging.Logger;
import java.util.Date;
import javax.ejb.EJB;
import raccoon.suvisa.logica.servicios.manejador.entidades.su.*;
import javax.ejb.Stateful;
import raccoon.suvisa.datos.entities.Entidad;
import raccoon.suvisa.datos.entities.Tarjeta;
//import raccoon.suvisa.datos.entities.Tarjetahabiente;
import raccoon.suvisa.datos.entities.Thabiente;
import raccoon.suvisa.datos.entities.TipoTarjeta;
import raccoon.suvisa.datos.entities.Usuario;
import raccoon.suvisa.datos.fachadas.TarjetaHabienteRemote;
import raccoon.suvisa.logica.servicios.envioCorreoR.EnvioCorreoRemote;
import raccoon.suvisa.logica.servicios.localizadorServicios.LocalizadorDatosLocal;

/**
 *
 * @author Gabriel
 */
@Stateful
public class SuVisaBean implements SuVisaRemote {

    @EJB
    private LocalizadorDatosLocal manejador;

    /*este metodo crea un nuevo usuario*/
    public BigDecimal registrarUsuario(String nombre,
            String apellido, String email, String username, String password,
            String tipoIdentificacion, BigInteger numeroIdentificacion,
            String direccion, String telefono, BigInteger idEntidad, String rol) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            Usuario u = new Usuario();
            u.setApellido(apellido);
            u.setDireccion(direccion);
            u.setEmail(email);
            u.setIdEntidad(idEntidad);
            u.setNombre(nombre);
            u.setNumeroIdentificacion(numeroIdentificacion);
            u.setPassword(password);
            u.setRol(rol);
            u.setTelefono(telefono);
            u.setTipoIdentificacion(tipoIdentificacion);
            u.setUsername(username);
            u.setActivo('F');
            log.info("%%%%%estoy en registrar usuario---- a punto de llamar a guardarNuevoUsuario");
            return manejador.getFachadaDatos().getMetodosUsuario().guardarNuevoUsuario(u);

        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("ERROR Al registrarUsuario");
        }
        return new BigDecimal(0);
    }

    /*Registra una nueva tarjeta*/
    public BigDecimal registrarNuevaTarjeta(BigDecimal numeroTarjeta,
            String idTipoTarjeta, 
            BigDecimal idCuenta,
            char activa,
            Double saldo, 
            String paisexpedicion,
            Date fechaVencimiento,
            BigDecimal idEntidad) {

        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            log.info("en el try");
            Tarjeta t = new Tarjeta();
            t.setActiva(activa);
            t.setIdCuenta(idCuenta.toBigInteger());
            log.info("inserto idCuenta");
            t.setIdTipoTarjeta(idTipoTarjeta);
            log.info("---tipo tarjeta" + t.getIdTipoTarjeta());
            t.setNumeroTarjeta(numeroTarjeta.toBigInteger());
            log.info("inserto numeroTarjeta");
            t.setPaisexpedicion(paisexpedicion);
            t.setSaldo(saldo);
            t.setFechaVencimiento(fechaVencimiento);
            log.info("inserto fecha vencimiento");
            t.setIdEntidad(idEntidad.toBigInteger());
            BigDecimal tar = manejador.getFachadaDatos().getMetodosTarjeta().guardarNuevaTarjeta(t);
            return tar;
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("registrarNuevaTarjeta");
        }
        return new BigDecimal(0);
    }

    /*valida la zona a la que pertenece*/
    public boolean validarZonaTarjeta(BigDecimal idTarjeta, String zonaTransaccion) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            return manejador.getFachadaDatos().getMetodosTarjeta().validarZona(idTarjeta, zonaTransaccion);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("validarZonaTarjeta");
            return false;
        }
    }

    /*este metodo valida si los fondos de la tarjeta son suficientes
     *para cubrir una transacción
     */
    public boolean fondosSuficientes(BigDecimal idTarjeta, float montoTransaccion) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            return manejador.getFachadaDatos().getMetodosTarjeta().validarSaldo(idTarjeta, montoTransaccion);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("fondosSuficientes");
            return false;
        }
    }

    /*este metodo retorna el cupo que tiene la tarjeta*/
    public Double consultarCupoTarjeta(BigDecimal idTarjeta) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            Double bg = manejador.getFachadaDatos().getMetodosTarjeta().consultarCupo(idTarjeta);
            log.info("CUPO: " + bg.toString());
            return bg;
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("consultarCupoTarjeta");
            return new Double(0.0);
        }
    }

    /*Este metodo permite modificar el rango del cupo que
     *tiene un tipo de tarjeta
     */
    public boolean modificarCupoTarjeta(BigDecimal idTipotarjeta, Double nuevoMax, Double nuevoMin) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            TipoTarjeta tt = manejador.getFachadaDatos().getMetodosTipoTarjeta().getTipoTarjeta(idTipotarjeta);
            tt.setCupomax(nuevoMax);
            tt.setCupomin(nuevoMin);
            return manejador.getFachadaDatos().getMetodosTipoTarjeta().actualizarTipoTarjeta(tt);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("modificarCupoTarjeta");
            return false;
        }
    }

    /*Este metodo crea un nuevo tipo de tarjetas, para que las entidades
     *puedan asignarlas a los tarjetahabientes
     */
    public BigDecimal crearTipoTarjeta(String nombreTipotarjeta,
            double cupomax, double cupomin) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            TipoTarjeta tt = new TipoTarjeta();
            tt.setNombreTipotarjeta(nombreTipotarjeta);
            tt.setCupomax(cupomax);
            tt.setCupomin(cupomin);
            tt.setActivo('V');
            //tt.setIdTipotarjeta(idTipotarjeta);            
            return manejador.getFachadaDatos().getMetodosTipoTarjeta().guardarNuevoTipoTarjeta(tt);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("crearTipoTarjeta");
            return new BigDecimal(0);
        }
    }

    /*este metodo registra una nueva entidad en el sistema
     *y retorna el nuevo id generado.
     */
    public BigDecimal registrarNuevaEntidad(BigInteger nit, String nombreEntidad,
            char activo, char cajero, char sucursal, char entidadcomercial,
            char entidadServPublicos, char banco, char cajaCompensacion,
            char financiamientoComercial) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            Entidad nuevaE = new Entidad();
            nuevaE.setActivo(activo);
            nuevaE.setBanco(banco);
            nuevaE.setCajacompensasion(cajaCompensacion);
            nuevaE.setCajero(cajero);
            nuevaE.setEntidadcomercial(entidadcomercial);
            nuevaE.setEntidadservpublicos(entidadServPublicos);
            nuevaE.setFinanciamientocomercial(financiamientoComercial);
            //nuevaE.setIdEntidad(idEntidad);
            nuevaE.setNit(nit);
            nuevaE.setNombreEntidad(nombreEntidad);
            nuevaE.setSucursal("" + sucursal);
            return manejador.getFachadaDatos().getMetodosEntidad().guardarNuevaEntidad(nuevaE);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("registrarNuevaEntidad");
            return new BigDecimal(0);
        }
    }

    /*Este metodo se encarga de desactiar entidades, ya
     *sean bancos, entidades financieras, sucursales
     *entidades comerciales, entidades de servicios publicos
     *caja de compensación ó entidades de financiamiento comercial
     */
    public boolean desactivarEntidad(BigDecimal idEntidad) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            Entidad en = manejador.getFachadaDatos().getMetodosEntidad().getentidad(idEntidad);
            en.setActivo('F');
            return manejador.getFachadaDatos().getMetodosEntidad().actualizarEntidad(en);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("desactivarEntidad");
            return false;
        }
    }

    /*Este metodo aprueba el registro de una entidad, es decir el
     *campo de activo se convierte en V
     */
    public boolean aprobarRegistroEntidad(BigDecimal idEntidad) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            Entidad e = manejador.getFachadaDatos().getMetodosEntidad().getentidad(idEntidad);
            e.setActivo('V');
            return manejador.getFachadaDatos().getMetodosEntidad().actualizarEntidad(e);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("aprobarRegistroEntidadFinanciera");
            return false;
        }
    }

    /*este metodo desactiva un tipo de tarjeta
     */
    public boolean desactivarTipoTarjeta(BigDecimal idTipotarjeta) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            return manejador.getFachadaDatos().getMetodosTipoTarjeta().desactivarTarjeta(idTipotarjeta);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("desactivarTipoTarjeta");
            return false;
        }
    }

    public boolean activarTarjeta(BigDecimal idTarjeta) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            Tarjeta t = manejador.getFachadaDatos().getMetodosTarjeta().getTarjeta(idTarjeta);
            t.setActiva('V');
            return manejador.getFachadaDatos().getMetodosTarjeta().actualizarTarjeta(t);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("activarTarjeta");
            return false;
        }
    }

    public boolean registrarTarjetaHabiente(String numeroidentificacion,
            String nombre, String apellido, String telefono, String direccion,
            Double cupoaprobado, Double ingresosmensuales, String email,
            BigDecimal idEntidad) {
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            Thabiente th = new Thabiente();
            log.info("antes de agregarlo: "+numeroidentificacion.toString());
            th.setNid(numeroidentificacion);
            th.setNombre(nombre);
            th.setApellido(apellido);
            th.setTel(telefono);
            th.setDir(direccion);
            th.setCupoa(cupoaprobado);
            th.setIngresomes(ingresosmensuales);
            th.setAprovado('F');
            th.setActivo('F');
            if (email.equalsIgnoreCase("")) {
                th.setEmail("no hay");
            } else {
                th.setEmail(email);
            }            
            TarjetaHabienteRemote rem = manejador.getFachadaDatos().getMetodosTarjetaHabiente();
            return rem.guardarNuevoTarjetaHabiente(th, idEntidad);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("registrarTarjetaHabiente");
            return false;
        }
    }

    public void mandarMailActivacion(Usuario u) {
        try {
            EnvioCorreoRemote ecr = null;
            ecr.enviarCorreo(u);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("mandarMailActivacion");
        }
    }

    public boolean bloquearTarjetaHabiente(String numeroidentificacion) {
        Thabiente th = new Thabiente();
        try {
            Logger log = Logger.getLogger(SuVisaBean.class.getName());
            th = manejador.getFachadaDatos().getMetodosTarjetaHabiente().getTarjetahabiente(numeroidentificacion);
            th.setActivo('F');
            log.info(th.getActivo()+"");
            return manejador.getFachadaDatos().getMetodosTarjetaHabiente().actualizarTarjetaHabiente(th);
        } catch (Exception e) {
            Logger.getLogger(SuVisaBean.class.getName()).info("bloquearTarjetaHabiente");
            return false;
        }
    }
}
